package broadcastReceivers;

import java.util.List;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.widget.Toast;

import com.example.wifiunlockscreen.services.UnlockScreenService;
import com.example.wifiunlockscreen.support.WifiInfoManager;

//Receptor de eventos
/*Se llama al metodo onReceive cuando dectectamos un cambio en la conectividad wifi*/
public class WifiBroadcastReceiver extends BroadcastReceiver {

	
	WifiInfoManager wifiInfoObjet;
	
	//Constructores
	public WifiBroadcastReceiver() {
		    super();
	}
	
	
	public WifiBroadcastReceiver(WifiInfoManager wifi) {
		wifiInfoObjet = wifi;
	}	 
	
	//El receptor, dependiendo del estado del wifi, debe habilitar o deshabilitar el bloqueo de pantalla
	@Override
	public void onReceive(Context contexto, Intent arg1) {
		Toast mensaje = new Toast(contexto);
		//mensaje.makeText(contexto,"Entro en el receptor", Toast.LENGTH_SHORT).show();
		
			
			//Estado de la WIFI
			  int extraWifiState = arg1.getIntExtra(WifiManager.EXTRA_WIFI_STATE , WifiManager.WIFI_STATE_UNKNOWN);
			  if (!WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(arg1.getAction())) {//Si se inicia el receptor de primeras(no detecta un cambio)
				  switch(extraWifiState){
				  case WifiManager.WIFI_STATE_DISABLED://Wifi apagado
				   //WifiState.setText("WIFI STATE DISABLED");
					  //contexto.stopService(intencion);
					  wifiInfoObjet.enableLock(contexto);
				   break;
				  case WifiManager.WIFI_STATE_DISABLING:
				   //WifiState.setText("WIFI STATE DISABLING");
					  //contexto.stopService(intencion);
				   break;
				  case WifiManager.WIFI_STATE_ENABLED:
				   //WifiState.setText("WIFI STATE ENABLED");
					  //contexto.startService(intencion);
					  validaWifi(contexto,mensaje);
				   break;
				  case WifiManager.WIFI_STATE_ENABLING:
				   //WifiState.setText("WIFI STATE ENABLING");
					  //contexto.startService(intencion);
				   break;
				  case WifiManager.WIFI_STATE_UNKNOWN:
				   //WifiState.setText("WIFI STATE UNKNOWN");
					  //contexto.stopService(arg1);
				   break;
				  }
				  
			//Wifi conectada
			  }else if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(arg1.getAction())) {//Si hay cambios en la conectividad
				   NetworkInfo nwInfo = arg1.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
				   if(NetworkInfo.State.CONNECTED.equals(nwInfo.getState())){//This implies the WiFi connection is through

					   validaWifi(contexto,mensaje);
				    	
				    	
				    }else if(NetworkInfo.State.CONNECTING.equals(nwInfo.getState())){//Si esta conectando no hacemos nada
				    	//DO NOTHING
				    }else{//Si es cualquier otra cosa deshabilitamos, por si acaso
				    	EnableOrDisable(false,contexto);
				    }
			  }
			  
			  //Pantalla apagada y encendida
			  if (arg1.getAction().equals(Intent.ACTION_SCREEN_OFF)) {//si la pantalla se apaga
		            // DO WHATEVER YOU NEED TO DO HERE
				  	//validaWifi(contexto,mensaje);
		      } else if (arg1.getAction().equals(Intent.ACTION_SCREEN_ON)) {//si la pantalla se enciende
		            // AND DO WHATEVER YOU NEED TO DO HERE
		    	  validaWifi(contexto,mensaje);
		      }
			  
			  if(arg1.ACTION_USER_PRESENT.equals(arg1.getAction())){
				  validaWifi(contexto,mensaje);
			  }
		
		


				  
	}

	
	private void validaWifi(Context contexto, Toast mensaje){
		
		  String nombreWifi = wifiInfoObjet.getCurrentSsid(contexto);//Obtenemos el nombre de la wifi conectada
		  Boolean esFav=false;
		  if(nombreWifi!=null && !nombreWifi.equals("")){
			  //mensaje.makeText(contexto,"Voy a llamar a la base de datos 2", Toast.LENGTH_SHORT).show();
			  esFav = wifiInfoObjet.esFavorito(nombreWifi);//Llamamos a la BBDD
			  //mensaje.makeText(contexto,"Vuelvo de la bse de datos 2", Toast.LENGTH_SHORT).show();
		  }
		  
		  if(contexto==null){
			  //mensaje.makeText(contexto,"Contexto nulo", Toast.LENGTH_SHORT).show();
		  }
		  EnableOrDisable(esFav,contexto);//Enviamos el resultado(boolean) para que habilite o no el bloqueo
		  
	}
	
	//Metodo que llama al Manager para activar o no el bloqueo de pantalla
	private void EnableOrDisable(Boolean esFav, Context contexto){
		  if(esFav!=null && esFav){
			  //if esta en la BBDD
			  wifiInfoObjet.disableLock(contexto);
		  }else{
			  wifiInfoObjet.enableLock(contexto);
		  }
	}

	
}
